style->depends_on_font_size = _gtk_bitmask_new ();
}
+static void
+maybe_unref_section (gpointer section)
+{
+ if (section)
+ gtk_css_section_unref (section);
+}
+
+static void
+gtk_css_static_style_set_value (GtkCssStaticStyle *style,
+ guint id,
+ GtkCssValue *value,
+ GtkCssSection *section)
+{
+ if (style->values == NULL)
+ style->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
+ if (id >= style->values->len)
+ g_ptr_array_set_size (style->values, id + 1);
+
+ if (g_ptr_array_index (style->values, id))
+ _gtk_css_value_unref (g_ptr_array_index (style->values, id));
+ g_ptr_array_index (style->values, id) = _gtk_css_value_ref (value);
+
+ if (style->sections && style->sections->len > id && g_ptr_array_index (style->sections, id))
+ {
+ gtk_css_section_unref (g_ptr_array_index (style->sections, id));
+ g_ptr_array_index (style->sections, id) = NULL;
+ }
+
+ if (section)
+ {
+ if (style->sections == NULL)
+ style->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
+ if (style->sections->len <= id)
+ g_ptr_array_set_size (style->sections, id + 1);
+
+ g_ptr_array_index (style->sections, id) = gtk_css_section_ref (section);
+ }
+}
+
GtkCssStyle *
gtk_css_static_style_new (void)
{
return g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
}
-static void
-maybe_unref_section (gpointer section)
+GtkCssStyle *
+gtk_css_static_style_copy (GtkCssStaticStyle *original,
+ const GtkBitmask *properties_to_not_copy)
{
- if (section)
- gtk_css_section_unref (section);
+ GtkCssStaticStyle *copy;
+ guint i;
+
+ copy = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
+
+ copy->depends_on_parent = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_parent, original->depends_on_parent),
+ properties_to_not_copy);
+ copy->equals_parent = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->equals_parent, original->equals_parent),
+ properties_to_not_copy);
+ copy->depends_on_color = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_color, original->depends_on_color),
+ properties_to_not_copy);
+ copy->depends_on_font_size = _gtk_bitmask_subtract (_gtk_bitmask_union (copy->depends_on_font_size, original->depends_on_font_size),
+ properties_to_not_copy);
+
+ for (i = 0; i < original->values->len; i++)
+ {
+ if (_gtk_bitmask_get (properties_to_not_copy, i))
+ continue;
+
+ gtk_css_static_style_set_value (copy,
+ i,
+ gtk_css_static_style_get_value (GTK_CSS_STYLE (original), i),
+ gtk_css_static_style_get_section (GTK_CSS_STYLE (original), i));
+ }
+
+ return GTK_CSS_STYLE (copy);
}
void
value = _gtk_css_value_compute (specified, id, provider, scale, GTK_CSS_STYLE (style), parent_style, &dependencies);
- if (style->values == NULL)
- style->values = g_ptr_array_new_with_free_func ((GDestroyNotify)_gtk_css_value_unref);
- if (id >= style->values->len)
- g_ptr_array_set_size (style->values, id + 1);
-
- if (g_ptr_array_index (style->values, id))
- _gtk_css_value_unref (g_ptr_array_index (style->values, id));
- g_ptr_array_index (style->values, id) = _gtk_css_value_ref (value);
+ gtk_css_static_style_set_value (style, id, value, section);
if (dependencies & (GTK_CSS_DEPENDS_ON_PARENT | GTK_CSS_EQUALS_PARENT))
style->depends_on_parent = _gtk_bitmask_set (style->depends_on_parent, id, TRUE);
if (dependencies & (GTK_CSS_DEPENDS_ON_FONT_SIZE))
style->depends_on_font_size = _gtk_bitmask_set (style->depends_on_font_size, id, TRUE);
- if (style->sections && style->sections->len > id && g_ptr_array_index (style->sections, id))
- {
- gtk_css_section_unref (g_ptr_array_index (style->sections, id));
- g_ptr_array_index (style->sections, id) = NULL;
- }
-
- if (section)
- {
- if (style->sections == NULL)
- style->sections = g_ptr_array_new_with_free_func (maybe_unref_section);
- if (style->sections->len <= id)
- g_ptr_array_set_size (style->sections, id + 1);
-
- g_ptr_array_index (style->sections, id) = gtk_css_section_ref (section);
- }
-
_gtk_css_value_unref (value);
_gtk_css_value_unref (specified);
}
return path;
}
-static void
+static GtkCssStyle *
update_properties (GtkStyleContext *context,
GtkCssStyle *style,
const GtkCssNodeDeclaration *decl,
GtkWidgetPath *path;
GtkCssLookup *lookup;
GtkBitmask *changes;
+ GtkCssStyle *result;
priv = context->priv;
if (_gtk_bitmask_is_empty (changes))
{
_gtk_bitmask_free (changes);
- return;
+ return g_object_ref (style);
}
+ result = gtk_css_static_style_copy (GTK_CSS_STATIC_STYLE (style), changes);
path = create_query_path (context, decl);
lookup = _gtk_css_lookup_new (changes);
_gtk_css_lookup_resolve (lookup,
GTK_STYLE_PROVIDER_PRIVATE (priv->cascade),
priv->scale,
- GTK_CSS_STATIC_STYLE (style),
+ GTK_CSS_STATIC_STYLE (result),
priv->parent ? style_values_lookup (priv->parent) : NULL);
_gtk_css_lookup_free (lookup);
gtk_widget_path_free (path);
_gtk_bitmask_free (changes);
+
+ return result;
}
static GtkCssStyle *
const GtkCssNodeDeclaration *decl = key;
GtkCssStyle *values = value;
- update_properties (context, values, decl, parent_changes);
+ values = update_properties (context, values, decl, parent_changes);
+
+ g_hash_table_iter_replace (&iter, values);
}
gtk_style_context_clear_property_cache (context);
if (!_gtk_bitmask_is_empty (parent_changes))
{
+ GtkCssStyle *new_values;
+
if (GTK_IS_CSS_ANIMATED_STYLE (current))
- update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, parent_changes);
+ {
+ GtkCssStyle *new_base;
+
+ new_base = update_properties (context, GTK_CSS_ANIMATED_STYLE (current)->style, info->decl, parent_changes);
+ new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (current),
+ new_base,
+ timestamp);
+ g_object_unref (new_base);
+ }
else
- update_properties (context, current, info->decl, parent_changes);
- }
+ {
+ new_values = update_properties (context, current, info->decl, parent_changes);
+ }
- if (change & GTK_CSS_CHANGE_ANIMATE &&
+ style_info_set_values (info, new_values);
+ g_object_unref (new_values);
+ }
+ else if (change & GTK_CSS_CHANGE_ANIMATE &&
gtk_style_context_is_animating (context))
{
GtkCssStyle *new_values;
- new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (info->values), timestamp);
+ new_values = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (info->values),
+ GTK_CSS_ANIMATED_STYLE (info->values)->style,
+ timestamp);
style_info_set_values (info, new_values);
g_object_unref (new_values);